/**
 * 汇总报告服务模块
 * 生成监控系统的日报和统计报告
 */

const storage = require('../utils/storage');
const logger = require('../utils/logger');

class SummaryService {
  constructor() {
    this.timezone = 'Asia/Shanghai';
  }

  /**
   * 生成24小时监控汇总报告
   * @returns {Object} 汇总报告对象
   */
  generate24HoursSummary() {
    try {
      const stats = storage.getLast24HoursStats();
      const now = new Date();
      
      const summary = {
        reportTime: now.toLocaleString('zh-CN', { timeZone: this.timezone }),
        period: '过去24小时',
        ...stats,
        
        // 计算成功率
        successRate: stats.totalChecks > 0 
          ? ((stats.successfulChecks / stats.totalChecks) * 100).toFixed(1) 
          : 'N/A',
        
        // 格式化时间
        firstCheckFormatted: stats.firstCheck 
          ? new Date(stats.firstCheck).toLocaleString('zh-CN', { timeZone: this.timezone })
          : '无记录',
        lastCheckFormatted: stats.lastCheck 
          ? new Date(stats.lastCheck).toLocaleString('zh-CN', { timeZone: this.timezone })
          : '无记录',
        
        // 监控频率分析
        averageInterval: this.calculateAverageInterval(stats)
      };

      logger.info('24小时汇总报告生成完成');
      return summary;
    } catch (error) {
      logger.error(`生成汇总报告失败: ${error.message}`);
      return this.getEmptySummary();
    }
  }

  /**
   * 计算平均检查间隔
   * @param {Object} stats - 统计数据
   * @returns {string} 平均间隔描述
   */
  calculateAverageInterval(stats) {
    if (!stats.firstCheck || !stats.lastCheck || stats.totalChecks <= 1) {
      return 'N/A';
    }

    const firstTime = new Date(stats.firstCheck);
    const lastTime = new Date(stats.lastCheck);
    const totalTimeMs = lastTime - firstTime;
    const totalTimeHours = totalTimeMs / (1000 * 60 * 60);
    
    if (totalTimeHours < 1) {
      const totalTimeMinutes = totalTimeMs / (1000 * 60);
      const avgMinutes = totalTimeMinutes / Math.max(stats.totalChecks - 1, 1);
      return `约 ${avgMinutes.toFixed(1)} 分钟`;
    }
    
    const avgHours = totalTimeHours / Math.max(stats.totalChecks - 1, 1);
    return `约 ${avgHours.toFixed(1)} 小时`;
  }

  /**
   * 生成邮件HTML内容
   * @param {Object} summary - 汇总报告
   * @returns {string} HTML内容
   */
  generateEmailHTML(summary) {
    const statusIcon = summary.successRate >= 90 ? '✅' : 
                      summary.successRate >= 70 ? '⚠️' : '❌';
    
    return `
      <div style="font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto;">
        <h1 style="color: #2c3e50; text-align: center;">
          📊 Upbit 监控系统日报
        </h1>
        
        <div style="background-color: #ecf0f1; padding: 15px; border-radius: 8px; margin: 20px 0;">
          <h2 style="color: #34495e; margin-top: 0;">📅 报告概览</h2>
          <p><strong>报告时间：</strong>${summary.reportTime}</p>
          <p><strong>统计周期：</strong>${summary.period}</p>
          <p><strong>系统状态：</strong>${statusIcon} ${this.getSystemStatus(summary.successRate)}</p>
        </div>

        <div style="background-color: #e8f5e8; padding: 15px; border-radius: 8px; margin: 20px 0;">
          <h2 style="color: #27ae60; margin-top: 0;">🔍 监控统计</h2>
          <div style="display: grid; grid-template-columns: 1fr 1fr; gap: 10px;">
            <div>
              <p><strong>总检查次数：</strong><span style="color: #2980b9;">${summary.totalChecks}</span></p>
              <p><strong>成功检查：</strong><span style="color: #27ae60;">${summary.successfulChecks}</span></p>
              <p><strong>失败检查：</strong><span style="color: #e74c3c;">${summary.failedChecks}</span></p>
            </div>
            <div>
              <p><strong>成功率：</strong><span style="color: #f39c12;">${summary.successRate}%</span></p>
              <p><strong>检查间隔：</strong>${summary.averageInterval}</p>
              <p><strong>新增交易对：</strong><span style="color: #9b59b6;">${summary.newPairsFound}</span></p>
            </div>
          </div>
        </div>

        ${this.generateNewPairsSection(summary)}
        ${this.generateErrorsSection(summary)}
        ${this.generateTimelineSection(summary)}

        <div style="background-color: #f8f9fa; padding: 15px; border-radius: 8px; margin: 20px 0; border-left: 4px solid #007bff;">
          <h2 style="color: #495057; margin-top: 0;">📈 监控概况</h2>
          <p>监控系统在过去24小时内运行${summary.totalChecks > 0 ? '正常' : '异常'}，
          ${summary.newPairsFound > 0 ? 
            `发现了 ${summary.uniqueNewPairs.length} 个新的交易对。` : 
            '没有发现新的交易对。'}</p>
          ${summary.failedChecks > 0 ? 
            `<p style="color: #e74c3c;">⚠️ 注意：有 ${summary.failedChecks} 次检查失败，请关注系统状态。</p>` : 
            '<p style="color: #28a745;">✅ 所有检查均正常完成。</p>'}
        </div>

        <hr style="margin: 30px 0; border: none; border-top: 1px solid #dee2e6;">
        <p style="color: #6c757d; font-size: 12px; text-align: center;">
          此邮件由 Upbit 交易对监控系统自动发送<br>
          每日上午 9:00 定时发送 | 监控周期：24小时
        </p>
      </div>
    `;
  }

  /**
   * 生成新增交易对部分的HTML
   * @param {Object} summary - 汇总报告
   * @returns {string} HTML内容
   */
  generateNewPairsSection(summary) {
    if (summary.uniqueNewPairs.length === 0) {
      return `
        <div style="background-color: #fff3cd; padding: 15px; border-radius: 8px; margin: 20px 0;">
          <h2 style="color: #856404; margin-top: 0;">💰 新增交易对</h2>
          <p style="color: #856404;">过去24小时内没有发现新的交易对。</p>
        </div>
      `;
    }

    return `
      <div style="background-color: #d1ecf1; padding: 15px; border-radius: 8px; margin: 20px 0;">
        <h2 style="color: #0c5460; margin-top: 0;">🎉 新增交易对 (${summary.uniqueNewPairs.length}个)</h2>
        <ul style="list-style: none; padding: 0;">
          ${summary.uniqueNewPairs.map(pair => 
            `<li style="background: #bee5eb; margin: 5px 0; padding: 8px; border-radius: 4px;">
              <code style="background: #fff; padding: 2px 4px; border-radius: 2px; color: #0c5460;">${pair}</code>
            </li>`
          ).join('')}
        </ul>
      </div>
    `;
  }

  /**
   * 生成错误信息部分的HTML
   * @param {Object} summary - 汇总报告
   * @returns {string} HTML内容
   */
  generateErrorsSection(summary) {
    if (summary.errors.length === 0) {
      return '';
    }

    return `
      <div style="background-color: #f8d7da; padding: 15px; border-radius: 8px; margin: 20px 0;">
        <h2 style="color: #721c24; margin-top: 0;">❌ 错误记录 (${summary.errors.length}条)</h2>
        <div style="max-height: 200px; overflow-y: auto;">
          ${summary.errors.slice(0, 5).map(error => `
            <div style="background: #f5c6cb; margin: 5px 0; padding: 8px; border-radius: 4px; font-size: 12px;">
              <strong>${new Date(error.timestamp).toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })}:</strong><br>
              <code>${error.error}</code>
            </div>
          `).join('')}
          ${summary.errors.length > 5 ? `<p style="color: #721c24; font-size: 12px;">... 还有 ${summary.errors.length - 5} 条错误记录</p>` : ''}
        </div>
      </div>
    `;
  }

  /**
   * 生成时间线部分的HTML
   * @param {Object} summary - 汇总报告
   * @returns {string} HTML内容
   */
  generateTimelineSection(summary) {
    return `
      <div style="background-color: #e2e3e5; padding: 15px; border-radius: 8px; margin: 20px 0;">
        <h2 style="color: #383d41; margin-top: 0;">⏰ 监控时间线</h2>
        <p><strong>首次检查：</strong>${summary.firstCheckFormatted}</p>
        <p><strong>最后检查：</strong>${summary.lastCheckFormatted}</p>
        <p><strong>平均间隔：</strong>${summary.averageInterval}</p>
      </div>
    `;
  }

  /**
   * 生成邮件文本内容
   * @param {Object} summary - 汇总报告
   * @returns {string} 文本内容
   */
  generateEmailText(summary) {
    const statusText = this.getSystemStatus(summary.successRate);
    
    let text = `
Upbit 监控系统日报

报告时间：${summary.reportTime}
统计周期：${summary.period}
系统状态：${statusText}

监控统计：
- 总检查次数：${summary.totalChecks}
- 成功检查：${summary.successfulChecks}
- 失败检查：${summary.failedChecks}
- 成功率：${summary.successRate}%
- 检查间隔：${summary.averageInterval}
- 新增交易对：${summary.newPairsFound}

`;

    if (summary.uniqueNewPairs.length > 0) {
      text += `新增交易对列表：\n`;
      summary.uniqueNewPairs.forEach(pair => {
        text += `- ${pair}\n`;
      });
      text += '\n';
    } else {
      text += '过去24小时内没有发现新的交易对。\n\n';
    }

    if (summary.errors.length > 0) {
      text += `错误记录 (${summary.errors.length}条)：\n`;
      summary.errors.slice(0, 3).forEach(error => {
        text += `- ${new Date(error.timestamp).toLocaleString('zh-CN', { timeZone: 'Asia/Shanghai' })}: ${error.error}\n`;
      });
      if (summary.errors.length > 3) {
        text += `... 还有 ${summary.errors.length - 3} 条错误记录\n`;
      }
      text += '\n';
    }

    text += `监控时间线：
- 首次检查：${summary.firstCheckFormatted}
- 最后检查：${summary.lastCheckFormatted}
- 平均间隔：${summary.averageInterval}

此邮件由 Upbit 交易对监控系统自动发送
每日上午 9:00 定时发送 | 监控周期：24小时
    `;

    return text;
  }

  /**
   * 获取系统状态描述
   * @param {string} successRate - 成功率
   * @returns {string} 状态描述
   */
  getSystemStatus(successRate) {
    const rate = parseFloat(successRate);
    if (isNaN(rate)) return '未知';
    if (rate >= 95) return '优秀';
    if (rate >= 90) return '良好';
    if (rate >= 70) return '正常';
    if (rate >= 50) return '警告';
    return '异常';
  }

  /**
   * 获取空的汇总报告（错误情况下使用）
   * @returns {Object} 空汇总报告
   */
  getEmptySummary() {
    const now = new Date();
    return {
      reportTime: now.toLocaleString('zh-CN', { timeZone: this.timezone }),
      period: '过去24小时',
      totalChecks: 0,
      successfulChecks: 0,
      failedChecks: 0,
      newPairsFound: 0,
      uniqueNewPairs: [],
      errors: [],
      firstCheckFormatted: '无记录',
      lastCheckFormatted: '无记录',
      successRate: 'N/A',
      averageInterval: 'N/A'
    };
  }
}

module.exports = SummaryService;
